

// 可选参数 => 也可以写也可以不写
/* function buildName(firstName: string, lastName?: string) {
    if (lastName) {
        return firstName + ' ' + lastName;
    } else {
        return firstName;
    }
} */

// 参数默认值  (如果设置了默认值,参数默认会变为可选参数)

interface AddFn {
    (a:number,b:number):number
}

let sum:AddFn = function(a:number = 0,b:number = 0):number{
    return a + b;
}

// sum();
// sum(undefined,undefined);  // 开启了严格模式 不能将 undefined赋值给其他类型的变量



// 剩余参数
function push(array: number [], ...items: number[]): number[] {
    items.forEach(function(item) {
        array.push(item);
    });
    return array;
}


// 重载§
// 重载允许一个函数接受不同数量或类型的参数时，作出不同的处理。

// 比如，我们需要实现一个函数 reverse，输入数字 123 的时候，输出反转的数字 321，输入字符串 'hello' 的时候，输出反转的字符串 'olleh'。

// function reverse(x: number | string): number | string | void {
//     if (typeof x === 'number') {
//         return Number(x.toString().split('').reverse().join(''));
//     } else if (typeof x === 'string') {
//         return x.split('').reverse().join('');
//     }
// }

// 然而这样有一个缺点，就是不能够精确的表达，输入为数字的时候，输出也应该为数字，输入为字符串的时候，输出也应该为字符串。

// 函数重载
function reverse(x:number):number;
function reverse(x:string):string;
// 函数实现
function reverse(x: number | string): number | string | void {
    if (typeof x === 'number') {
        return Number(x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

reverse("123")












export default 8;